package com.lmaos.basetools.base;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

/**
 * 
 * @author lmaos
 *
 * <p>作者：张星宇</p>
 * <p>时间：2017年6月16日 上午8:24:17</p>
 * <p>说明:位移工具	</p>
 *
 */
public class SDisplacement {
	/**
	 * 说明：等分随机交换位置		<br>
	 * 时间：2017年6月16日 上午8:57:59
	 *
	 * @param array 数组或list
	 * @param size 每分多少数量
	 * @param subrandom 是否对每分进行随机放置
	 */
	@SuppressWarnings("rawtypes")
	public static void dengfenJiaoHuan(Object array,int size,boolean subrandom){
		if(!SArrayUtils.isArrays(array)||size <= 0){
			return;
		}
		Random rd = new Random();
		Set<Integer> rindexs = new HashSet<Integer>();
		List<List> lists = groupArray(array, size);
		int arrIndex = 0;
		for (int num = 0; num < lists.size(); num++) {
			int rindex = rd.nextInt(lists.size());
			if(rindexs.contains(rindex)){
				num--;
			}else{
				rindexs.add(rindex);
				List subList = lists.get(rindex);
				if(subrandom){
					randomArray(subList);
				}
				for (Object value : subList) {
					SArrayUtils.set(array, arrIndex, value);
					arrIndex++;
				}
			}
		}
	}
	/**
	 * 说明：随机数组排序		<br>
	 * 时间：2017年6月16日 上午9:25:55
	 *
	 * @param array 数组或list
	 */
	public static void randomArray(Object array){
		if(!SArrayUtils.isArrays(array)){
			return;
		}
		Set<Integer> rindexs = new HashSet<Integer>();
		int length = SArrayUtils.getLength(array);
		Object narray = SArrayUtils.createArray(array.getClass(), length);
		Random rd = new Random();
		for (int nindex = 0; nindex < length; nindex++) {
			int rindex = rd.nextInt(length);
			if(rindexs.contains(rindex)){
				nindex--;
			}else{
				rindexs.add(rindex);
				SArrayUtils.set(narray, nindex, SArrayUtils.get(array, rindex));
			}
		}
		SArrayUtils.copy(narray, array);
	}
	/** 
	 * 说明：数组分组		<br>
	 * 时间：2017年6月16日 上午9:30:26
	 *
	 * @param array 数组或list
	 * @param size 每组数量
	 * @return 分组后数据
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static List<List> groupArray(Object array,int size){
		if(!SArrayUtils.isArrays(array)){
			return null;
		}
		int length = SArrayUtils.getLength(array);
		List<List> lists = new ArrayList<List>();
		List subList = null;
		for (int index = 0; index < length; index++) {
			if(index%size == 0){
				subList = new ArrayList();
				lists.add(subList);
			}
			subList.add(SArrayUtils.get(array, index));
		}
		return lists;
	}
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(0);
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(6);
		list.add(7);
		list.add(8);
		list.add(9);
		dengfenJiaoHuan(list, 100,true);
		System.out.println(list);
	}
}
